import java.util.ArrayList;

/**
 * @author minasora
 * @date 2019/10/7 16:12
 * @description Route类，每一个route储存了一辆车所访问的顾客
 */
public class Route {
    ArrayList<Integer> cus_list = new ArrayList<>();// 此路径中的客户访问序列

    double value;
    boolean if_feasible;

    boolean check()//检查可行性
    {
        return (check_c() && check_t());
    }

    // 检查此路径的容量限制约束
    boolean check_c() {
        int ans = 0;
        for (int i : this.cus_list) {
            ans += Conf.customers[i].demand;
        }

        return ans < Conf.Cap;

    }

    // 检查此路径的时间窗约束
    boolean check_t() {
        double time = 0;
        // 1.从仓库出发检测时间窗
        time += Conf.dis_matriax[0][this.cus_list.get(0)];
        if (time > Conf.customers[cus_list.get(0)].d_time) return false;
        // 2.检测其他客户的时间窗
        for (int i = 1; i <= this.cus_list.size() - 1; i++) {
            time = Math.max(Conf.customers[this.cus_list.get(i - 1)].r_time, time + Conf.dis_matriax[this.cus_list.get(i - 1)][this.cus_list.get(i)]);
            if (time > Conf.customers[cus_list.get(i)].d_time) return false;
        }
        return true;
    }

    /**
     * 获得route的dis
     *
     * @return
     */
    double getValue() {
        this.value = 0;
        value += Conf.dis_matriax[0][cus_list.get(0)];// 从仓库出发
        value += Conf.dis_matriax[0][cus_list.get(cus_list.size() - 1)];// 回到仓库
        if (cus_list.size() > 1) {
            for (int i = 1; i < cus_list.size(); i++) {
                value += Conf.dis_matriax[cus_list.get(i)][cus_list.get(i - 1)];
            }
        }
        return value;
    }
}